#include <iostream>
using namespace std;

/*
	模板类的定义
	    定义类：要求这个类可以给任意类型的指针申请堆空间
*/

template<typename T>
class Test  //模板类 
{
public:
	Test()
	{
		cout<<"构造函数调用，申请堆空间"<<endl;
		p=new T[10]; //p=new 类型[10]
	}
	~Test()
	{
		cout<<"析构函数调用，释放堆空间"<<endl;
		delete []p;
	}
private:
	T *p; //万能类型的指针
};

template<typename T1,typename T2>
class Base  //模板类 
{
public:
private:
	T1 a;
	T2 b;
};


int main()
{
	//模板类创建对象
	//Test t1; //错误的，以前的类(非模板类)才可以这么写
	//Test<int> t1;     //模板类创建对象，必须要传递模板参数
	//Test<double> t2; //模板类创建对象，必须要传递模板参数
	
	/*
		模板类底层原理：编译器会依据你传递的模板参数类型，生成对应版本的类声明
		  class Base<int,double>
		  {
			public:
			private:
				int a;
				double b;
		  }
	*/
	Base<int,double> b1; //int对应T1   double对应T2
	Base<double,int> b2; //double对应T1   int对应T2
}